// 其实不难 仔细想想 转弯的时候的 step 变化就行 
// 顺 01 10 0-1 -10
// 逆 10 01 -10 0-1

let arr2 = []

let x = 6 // 列
let y = 5 // 行
// for 外行内列
for (let i = 0; i < y; i++) {
    let line = []
    for (let j = 0; j < x; j++) {
        line.push(0)
    }
    arr2.push(line)
}
console.log(arr2)

// 上面是我生成的二维数组

// 下面是老师的
function vortex(n, m) {
    const nums = new Array(n).fill(0).map(() => new Array(m).fill(0))
    return nums
}


function vortex(n, m) {
    const nums = new Array(n).fill(0).map(() => new Array(m).fill(0))
    let i = 0, j = 0; // i行号 j列号
    let count = 1;
    let stepI = 0; // 行的下一个是 i+stepI 下 同理
    let stepJ = 1;

    // 判断指定位置是否有值
    // 1 横向超出
    // 2 竖向超出
    function hasBlock(i, j) {
        return !nums[i] || nums[i][j] !== 0
    }

    while (1) {
        nums[i][j] = count++

        i += stepI
        j += stepJ
        // 有阻碍的时候考虑转弯
        if (hasBlock(i, j)) {
            // 下个位置不存在之后 考虑如下
            // 1先回退 2再考虑往哪个方向转 3转弯

            // 1先回退
            i -= stepI
            j -= stepJ

            // 2再考虑往哪个方向转 step 的变化是 0|1 1|0 0|负1 -1|0
            if (stepI === 0) {
                stepI = stepJ;
                stepJ = 0;
            } else {
                stepJ = -stepI;
                stepI = 0;
            }

            // 真正的转弯
            i += stepI
            j += stepJ

            // 若到了最里面 任何方向都走完了就停止
            if (hasBlock(i, j)) {
                break
            }
        }
    }
    return nums;
}
console.log(vortex(5, 6));
// 结果是
// [
//     [ 1, 2, 3, 4, 5, 6 ],
//     [ 18, 19, 20, 21, 22, 7 ],
//     [ 17, 28, 29, 30, 23, 8 ],
//     [ 16, 27, 26, 25, 24, 9 ],
//     [ 15, 14, 13, 12, 11, 10 ]
//   ]
  

// 突发奇想 逆时针试试 
function vortexN(n, m) {
    const nums = new Array(n).fill(0).map(() => new Array(m).fill(0))
    let i = 0, j = 0; // i行号 j列号
    let count = 1;
    let stepI = 1; // 行的下一个是 i+stepI 下 同理
    let stepJ = 0;

    // 判断指定位置是否有值
    // 1 横向超出
    // 2 竖向超出
    function hasBlock(i, j) {
        return !nums[i] || nums[i][j] !== 0
    }

    while (1) {
        nums[i][j] = count++

        i += stepI
        j += stepJ
        // 有阻碍的时候考虑转弯
        if (hasBlock(i, j)) {
            // 下个位置不存在之后 考虑如下
            // 1先回退 2再考虑往哪个方向转 3转弯

            // 1先回退
            i -= stepI
            j -= stepJ

            // 2再考虑往哪个方向转 step 的变化是 0|1 1|0 0|负1 -1|0
            if (stepJ === 0) {
                stepJ = stepI;
                stepI = 0;
            } else {
                stepI = -stepJ;
                stepJ = 0;
            }

            // 真正的转弯
            i += stepI
            j += stepJ

            // 若到了最里面 任何方向都走完了就停止
            if (hasBlock(i, j)) {
                break
            }
        }
    }
    return nums;
}
console.log(vortexN(5, 6));
// [
//     [ 1, 18, 17, 16, 15, 14 ],
//     [ 2, 19, 28, 27, 26, 13 ],
//     [ 3, 20, 29, 30, 25, 12 ],
//     [ 4, 21, 22, 23, 24, 11 ],
//     [ 5, 6, 7, 8, 9, 10 ]
//   ]
  